package com.nebula.salary.portal.service;

import com.nebula.salary.common.result.ServerResponse;
import com.nebula.salary.model.pojo.Navigation;
import com.baomidou.mybatisplus.extension.service.IService;
import com.nebula.salary.model.vo.RoleMenuVo;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * <p>
 * 菜单表 服务类
 * </p>
 *
 * @author codex
 * @since 2022-01-24
 */
public interface INavigationService extends IService<Navigation> {
    
    /**
     * 获取登录用户有权限的菜单目录
     *
     * @param request request
     * @return 菜单
     */
    List<Navigation> getNavigation(HttpServletRequest request);
    
    /**
     * 根据角色获取菜单列表
     *
     * @return 菜单集合
     */
    List<Navigation> getNavigationWithRole();
    
    /**
     * 根据角色ID获取选中的菜单编号集合
     *
     * @param roleId 角色ID
     * @return 菜单编号集合
     */
    List<Integer> selectMenuListByRoleId(Integer roleId);
    
    /**
     * 根据用户ID获取选中的菜单编号集合
     *
     * @return 菜单集合
     */
    List<Navigation> selectMenuListByUserId();
    
    /**
     * 构建前端角色管理所需要下拉树结构
     *
     * @param navigations 菜单列表
     * @return 下拉树结构列表
     */
    List<RoleMenuVo> buildMenuTreeSelect(List<Navigation> navigations);
    
    /**
     * 根据用户ID获取菜单树形列表
     *
     * @return
     */
    List<Navigation> treeSelect();
    
    /**
     * 构建前端所需要下拉树结构
     *
     * @param navigations 菜单列表
     * @return 下拉树结构列表
     */
    List<Navigation> buildTreeList(List<Navigation> navigations);
    
    /**
     * 校验菜单名称是否唯一
     *
     * @param navigation 菜单信息
     * @return 校验结果
     */
    String checkItemUnique(Navigation navigation);
    
    /**
     * 校验显示排序是否唯一
     *
     * @param navigation 菜单信息
     * @return 校验结果
     */
    String checkSortUnique(Navigation navigation);
    
    /**
     * 校验路由地址是否唯一
     *
     * @param navigation 菜单信息
     * @return校验结果
     */
    String checkPathUnique(Navigation navigation);
    
    /**
     * 新增菜单
     *
     * @param navigation 菜单信息
     * @return 影响行数
     */
    int add(Navigation navigation);
    
    /**
     * 校验菜单是否有子菜单
     *
     * @param navId 菜单编号
     * @return 结果
     */
    boolean hasChildByNavId(Integer navId);
    
    /**
     * 校验菜单是否已分配
     *
     * @param navId 菜单编号
     * @return 结果
     */
    boolean checkMenuExistRole(Integer navId);
    
    /**
     * 修改菜单
     *
     * @param navigation 菜单信息
     * @return 影响行数
     */
    int update(Navigation navigation);
}
